import { Controller } from 'egg';
import BaseError from '~/error/BaseError';
import utils from '~/utils';
import ErrorCodeConstant from "~/constants/error_code";

export default class IndexController extends Controller {

    async index() {
        const { ctx } = this;

        try {

            // 获取 Application 对象
            const app = this.app;
            const ctx_app = this.ctx.app;

            // 获取 Context 对象
            const this_ctx = this.ctx;

            // 获取 Header
            // ctx.ip; // 用于获取请求发起方的 IP 地址
            // 设置 Header
            // ctx.set(key, value)
            // 设置一个响应头
            // ctx.set('show-response-time', used.toString());

            // 获取 Request
            const request = ctx.request;
            // 获取GET请求中的 `id` 参数.  ?id=1
            // const id = ctx.request.query.id;
            // 获取 POST 的 body 应该使用 ctx.request.body
            const body = ctx.request.body;
            const { id } = ctx.request.body;

            // Response
            const response = ctx.response;
            // this.ctx.response.body = {};

            // Helper
            const helper = ctx.helper;

            // Config
            const config = this.app.config; // this.config

            const info = {
                app,
                ctx,
                request,
                response,
                helper,
                config
            };

            ctx.body = utils.resp.success('请求成功', info);
        } catch (err: any) {
            if (err instanceof Error) {
                ctx.body = utils.resp.fail(err.message);
            } else {
                ctx.body = utils.resp.fail(ErrorCodeConstant.getDesc(ErrorCodeConstant.INVALID), ErrorCodeConstant.INVALID);
            }
            return false;
        }
    }

    async list() {
        const { ctx } = this;

        try {
            const info = await ctx.service.test.list();
            ctx.body = utils.resp.success('请求成功', info);
        } catch (err: any) {
            if (err instanceof Error) {
                ctx.body = utils.resp.fail(err.message);
            } else {
                ctx.body = utils.resp.fail(ErrorCodeConstant.getDesc(ErrorCodeConstant.INVALID), ErrorCodeConstant.INVALID);
            }
            return false;
        }
    }

    async create() {
        const { ctx } = this;

        // 验证
        try {
            ctx.validate({
                name: {
                    type: 'string',
                    required: true,
                    message: '自定义错误消息'
                },
            });
        } catch (err: any) {
            let message = err.errors[0]['field'] + ' ' + err.errors[0]['message'];
            ctx.body = utils.resp.fail(message);
            return false;
        }

        try {
            await ctx.service.test.create();
            ctx.body = utils.resp.success('请求成功');
        } catch (err: any) {
            if (err instanceof Error) {
                ctx.body = utils.resp.fail(err.message);
            } else {
                ctx.body = utils.resp.fail(ErrorCodeConstant.getDesc(ErrorCodeConstant.INVALID), ErrorCodeConstant.INVALID);
            }
            return false;
        }
    }

    async update() {
        const { ctx } = this;

        // 验证
        try {
            ctx.validate({
                id: {
                    type: 'number',
                    format: /^\d+$/,
                    required: true,
                    message: '不能为空或不是 number 类型'
                },
            }, ctx.request.query);
        } catch (err: any) {
            let message = err.errors[0]['field'] + ' ' + err.errors[0]['message'];
            ctx.body = utils.resp.fail(message);
            return false;
        }

        try {
            await ctx.service.test.update();
            ctx.body = utils.resp.success('请求成功');
        } catch (err: any) {
            if (err instanceof Error) {
                ctx.body = utils.resp.fail(err.message);
            } else {
                ctx.body = utils.resp.fail(ErrorCodeConstant.getDesc(ErrorCodeConstant.INVALID), ErrorCodeConstant.INVALID);
            }
            return false;
        }
    }

    async detail() {
        const { ctx } = this;

        // try {
        //     ctx.validate({
        //         id: {
        //             type: 'number',
        //             format: /^\d+$/,
        //             required: true
        //         }
        //     });
        // } catch (err: any) {
        //     let message = err.errors[0]['field'] + ' ' + err.errors[0]['message'];
        //     ctx.body = utils.resp.fail(message);
        //     return false;
        // }

        const { id } = ctx.request.query; // ctx.request.body;

        try {
            const info = await ctx.service.test.detail(id);
            ctx.body = utils.resp.success('请求成功', info);
        } catch (err: any) {
            ctx.body = utils.resp.fail(err.message);
        }
    }

    async delete() {
        const { ctx } = this;

        try {
            ctx.validate({
                id: {
                    type: 'number',
                    format: /^\d+$/,
                    required: true
                },
            });
        } catch (err: any) {
            let message = err.errors[0]['field'] + ' ' + err.errors[0]['message'];
            ctx.body = utils.resp.fail(message);
            return false;
        }

        const { id } = ctx.request.query; // ctx.request.body;

        try {
            await ctx.service.test.delete(id);
            ctx.body = utils.resp.success('请求成功');
        } catch (err: any) {
            ctx.body = utils.resp.fail(err.message);
        }
    }

    async redis() {
        const { ctx } = this;

        try {
            // redis 基本方法
            // set
            // await ctx.app.redis.set('foo', 'bar');
            // await ctx.app.redis.set('foo', 'bar', 'EX', 3600); // 设置过期时间3600秒
            // exists
            // await ctx.app.redis.exists('foo');
            // get
            // await ctx.app.redis.get('foo');
            // delete
            // await ctx.app.redis.del('foo');
            // 刷新过期时间
            // await ctx.app.redis.expire('foo', 3600);

            // 应用
            let list = <any[]>[];
            let key = 'user_list';
            if (!await ctx.app.redis.exists(key)) {
                list = utils.text.toRaw(
                    await ctx.model.Users.findAll({
                        where: {
                            'name': 'test'
                        },
                        order: [
                            ['id', 'desc']
                        ]
                    })
                );

                await ctx.app.redis.set(key, JSON.stringify(list));
            } else {
                list = JSON.parse(await ctx.app.redis.get(key) || '');
            }

            ctx.body = utils.resp.success('请求成功', {
                list
            });

        } catch (err: any) {
            ctx.body = utils.resp.fail(err.message);
        }
    }

}